<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
            //第一次练习
            // promise 回调函数里面有两个参数 分别时 resolve reject
        const p = new Promise((resolve,reject)=>{
            

            // 使用 try 和 catch 调试代码 和 捕获错误 
            // throw 会抛出错误
            try{
            //声明一个异步代码 
            setTimeout(()=>{
            //不调用resolve,reject 函数，状态是：promiseState 是pending 正在进行，promiseResult 为 undefined
            //调用resolve 函数  状态为：promiseState ：为fulfilled  promiseResult： 为resolve函数的实参
            resolve('成功')

            //调用 reject 函数  状态为：promiseState：为rejected    promiseResult：为reject函数的实参
            reject('失败啦')
            //这两个函数只会执行相对应的状态
            
            },2000)  

            }catch(e){
            reject(e.message)
            } 
        })
        console.log('p',p);
            //then 里面有两个回调函数 两个回调函数的形参一般为 value 和 reason
            //第一个回调函数处理成功的promise实例
            //第二个回调函数处理失败的promise实例
        const p1 = p.then((value)=>{
            //如果不写代码 状态跟promise实例保持一直 值为undefined
            //想要 p1 和 里面promise 有关联 需要把promise return 出去
            //如果代码里面有报错没有被处理 值为报错的信息
            console.log(value);
            return new Promise((resolve,reject)=>{
                try{
                    setTimeout(()=>{
                        console.log('数据请求成功');
                        resolve('okk')
                    })

                }catch(e){
                    reject(e.message)
                }
            })
        },(reason)=>{

        })
        console.log('p1',p1);



        //第二遍
        const k = new Promise((resolve,reject)=>{
            try{
            //声明一个异步代码 
            setTimeout(()=>{
            //不调用resolve,reject 函数，状态是：promiseState 是pending 正在进行，promiseResult 为 undefined
            //调用resolve 函数  状态为：promiseState ：为fulfilled  promiseResult： 为resolve函数的实参
            // resolve('成功')

            //调用 reject 函数  状态为：promiseState：为rejected    promiseResult：为reject函数的实参
            reject('失败啦')
            //这两个函数只会执行相对应的状态
            
            },1000)  

            }catch(e){
            reject(e.message)
            } 
        })
        console.log('k',k);
            //then 里面有两个回调函数 两个回调函数的形参一般为 value 和 reason
            //第一个回调函数处理成功的promise实例
            //第二个回调函数处理失败的promise实例
            const k1 = k.then((value)=>{
            //如果不写代码 状态跟promise实例保持一直 值为undefined
            //想要 k1 和 里面promise 有关联 需要把promise return 出去
            //如果代码里面有报错没有被处理 值为报错的信息
            // console.log(value);
            return new Promise((resolve,reject)=>{
                try{
                    setTimeout(()=>{
                        console.log('数据请求成功');
                        resolve('okk')
                    })

                }catch(e){
                    reject(e.message)
                }
            })
        },(reason)=>{
            return new Promise((resolve,reject)=>{
                try{
                    setTimeout(()=>{
                        console.log('数据请求失败');
                        resolve('no')
                    })

                }catch(e){
                    reject(e.message)
                }
            })
        })

        console.log('k1',k1);
        //第三遍
        const q = new Promise((resolve,reject)=>{
            try{
                setTimeout(()=>{
                    console.log('请求数据');
                    resolve('数据请求成功')
                },2000)
            }catch(e){
                reject(e.message)
            }
        })
        const q1 = q.then((value)=>{
            return new Promise((resolve,reject)=>{
                try{
            setTimeout(()=>{
            console.log('请求b数据');
            resolve('请求b数据成功')
           })
            }catch(e){
                reject(e.message)
            }
        
        })
        },(reason)=>{

        })
        console.log('q1',q1);
    </script>
</body>
</html>